package Q16_18_Pattern_Matcher; public class QuestionC { public static String buildFromPattern(String pattern, String main, String alt) { StringBuffer sb = new StringBuffer(); char first = pattern.charAt(0); for (char c : pattern.toCharArray()) { if (c == first) { sb.append(main); } else { sb.append(alt); } } return sb.toString(); } public static int countOf(String pattern, char c) { int count = 0; for (int i = 0; i < pattern.length(); i++) { if (pattern.charAt(i) == c) { count++; } } return count; } public static boolean doesMatch(String pattern, String value) { if (pattern.length() == 0) return value.length() == 0; char mainChar = pattern.charAt(0); char altChar = mainChar == 'a' ? 'b' : 'a'; int size = value.length(); int countOfMain = countOf(pattern, mainChar); int countOfAlt = pattern.length() - countOfMain; int firstAlt = pattern.indexOf(altChar); int maxMainSize = size / countOfMain; for (int mainSize = 0; mainSize <= maxMainSize; mainSize++) { int remainingLength = size - mainSize * countOfMain; String first = value.substring(0, mainSize); if (countOfAlt == 0 || remainingLength % countOfAlt == 0) { int altIndex = firstAlt * mainSize; int altSize = countOfAlt == 0 ? 0 : remainingLength / countOfAlt; String second = countOfAlt == 0 ? "" : value.substring(altIndex, altSize + altIndex); String candidate = buildFromPattern(pattern, first, second); if (candidate.equals(value)) { System.out.println(first + ", " + second); return true; } } } return false; } public static void main(String[] args) { String[][] tests = {{"ababb", "backbatbackbatbat"}, {"abab", "backsbatbackbats"}, {"aba", "backsbatbacksbat"}}; for (String[] test : tests) { String pattern = test[0]; String value = test[1]; System.out.println(pattern + ", " + value + ": " + doesMatch(pattern, value)); } } }